﻿#pragma once


#include <functional>
#include <string>
#include <vector>

struct netif;

class ZTcpClient {
public:
  /**
   * 构造函数
   * @param selfIP 自身的IP,需要和server的IP保持在同一网段
   * @param serverIP server的IP
   * @param serverPort server的port
   * @param callFunc 当收到server传来的数据时的回调处理函数
   */
  explicit ZTcpClient(std::string selfIP, std::string serverIP, int serverPort,
                      std::function<void(const std::string &)> callFunc
      );

  /**
   * 发送数据
   * @param dataPtr 数据指针
   * @param size 数据长度
   */
  void writeData(const char *dataPtr, int size);

private:
  /**
   * 初始化,C只接受static函数
   * @param self this指针
   */
  static void initialize(void *self);

  /**
   * 配置网络参数
   */
  void assignDefaultIp();

private:
  // client的socket
  int socket_{-1};
  // 网络配置参数
  netif* server_netif_{nullptr};
  // 自身的ip
  std::string selfIP_{};
  // 自身的端口
  int selfPort_{};
  // server的ip
  std::string serverIP_{};
  // server的端口
  int serverPort_{};
  // 当收到数据时的处理函数
  std::function<void(const std::string &)> callFunc_{};
};